//@author wtfumlomglol
package amm.Graphic;

import java.io.*;
import java.util.*;

//osztaly a jatekterep, vagyis a varos leirasahoz
public class City {

    //utak kollekcioja
    private ArrayList<Road> roads = new ArrayList<Road>();
    //keresztezodesek kollekcioja
    private ArrayList<XRoads> xroads = new ArrayList<XRoads>();
    //bankrablo
    private Criminal criminal;
    //civilek kollekcioja
    private ArrayList<Citizen> citizens = new ArrayList<Citizen>();
    //rendorok kollekcioja
    private ArrayList<Police> police = new ArrayList<Police>();
    //rendorseg
    private NotRoad policedept;
    //bank
    private NotRoad bank;
    //rejtekhely
    private NotRoad hideout;

    //Game hivja meg, hogy az uj bankrablot eltarolja
    public void addCriminal(Criminal cr) {
        criminal = cr;
    }

    //Game hivja meg, hogy az uj civilt eltarolja
    public void addCitizen(Citizen cz) {
        citizens.add(cz);
    }

    //Game hivja meg, hogy az uj rendort eltarolja
    public void addPolice(Police p) {
        switch (getPoliceLength()%3)
        {
            case 0: p.setType(CitizenType.TRABANT);
                break;
            case 1: p.setType(CitizenType.VOLKSWAGEN);
                break;
            case 2: p.setType(CitizenType.LAMBORGHINI);
                break;
        }
        police.add(p);
    }

    //Game hivja meg, hogy az uj bankot eltarolja
    public void addBank(NotRoad b) {
        bank = b;
    }

    //Game hivja meg, hogy az uj rendorseget eltarolja
    public void addPoliceStation(NotRoad ps) {
        policedept = ps;
    }

    //Game hivja meg, hogy az uj rejtekhelyet eltarolja
    public void addHideout(NotRoad h) {
        hideout = h;
    }

    //Game hivja meg, hogy az uj utat eltarolja
    public void addRoad(Road r) {
        roads.add(r);
    }

    //Game hivja meg, hogy az uj keresztezodest eltarolja
    public void addXRoads(XRoads xr) {
        xroads.add(xr);
    }

    //bankrablo koret kezdi
    public void tickCriminal() {
        if (criminal != null) {
            criminal.onTick();
        }
    }

    //civilek koret kezdi
    public void tickCitizens() {
        for (Citizen cz : citizens) {
            cz.onTick();
        }
    }

    //rendorok koret kezdi
    public void tickPolice() {
        for (Police p : police) {
            p.onTick();
        }
    }

    //lampak koret kezdi
    public void TickLights() {
        LightController lcActual;

        for (XRoads xr : xroads) {
            if ((lcActual = xr.getLC()) != null) {
                for (int i = 0; i < 4; i++) {
                    lcActual.getLight(i).onTick();
                }
            }
        }
    }

    //a civilek számát adja meg
    public int getCitizenLength()
    {
        return citizens.size();
    }

    //a rendőrök számát adja meg
    public int getPoliceLength()
    {
        return police.size();
    }

    //az utak számát adja meg
    public int getRoadLength()
    {
        return roads.size();
    }

    //a kereszteződések számát adja meg
    public int getXRoadsLength()
    {
        return xroads.size();
    }

    //a bankrabló referenciáját adja vissza
    public Criminal getCriminal()
    {
        return criminal;
    }

    //adott civil referenciáját adja vissza
    public Citizen getCitizen(int index)
    {
        return citizens.get(index);
    }

    //adott rendőr referenciáját adja vissza
    public Police getPolice(int index)
    {
        return police.get(index);
    }

    //adott út referenciáját adja vissza
    public Road getRoad(int index)
    {
        return roads.get(index);
    }

    //adott kereszteződés referenciáját adja vissza
    public XRoads getXRoads(int index)
    {
        return xroads.get(index);
    }

    //bank
    public NotRoad getBank()
    {
        return bank;
    }

    //rejtekhely
    public NotRoad getHideout()
    {
        return hideout;
    }

    //rendőrség
    public NotRoad getPoliceStation()
    {
        return policedept;
    }

    //összekapcsol két mezőt
    public void linkFields(Field from, Field to, Compass c)
    {
        from.setNeighbour(to, c, Direction.FORWARD);
        switch (c)
        {
            case EAST:
                to.setNeighbour(from, Compass.WEST, Direction.BACKWARD);
                break;
            case NORTH:
                to.setNeighbour(from, Compass.SOUTH, Direction.BACKWARD);
                break;
            case WEST:
                to.setNeighbour(from, Compass.EAST, Direction.BACKWARD);
                break;
            case SOUTH:
                to.setNeighbour(from, Compass.NORTH, Direction.BACKWARD);
                break;
        }
    }
}
